AWS EC2サーバに対するknife solo実行環境構築手順 on Mac OS Xを一から整理してみる
師匠様方が走り回りまくる今日この頃、皆様いかがお過ごしでしょうか。しんやです。
弊社AWSコンサルチームでは、AWSでの環境構築を『AWS CloudFormation単独(パッケージのインストール等もCloudFormationで兼ねる)』、若しくは『AWS CloudFormation+Knife Solo』という組み合わせで行うのが主流となっています。当エントリでは後者の方、『AWS CloudFormation+Knife Solo』で環境構築を行う際の『knife solo』に於ける環境構築手順について、意外と初見では踏むべき手順が多く、躓く点も多かった(と個人的には思っている)ので備忘録も兼ねてエントリとしてまとめておこうと思います。
- スタート地点
- Gitインストール
- rbenvインストール
- ruby-buildインストール
- Rubyインストール by rbenv
- knife-soloインストール by gem
- berkshelfのインストール by gem
- knife-soloの実行
- まとめ
スタート地点
スタートはここからです。Mac OS X(今回の場合は10.8.4)にデフォルトのRubyが入ってる状態から。ここからスタートしてみます。
$ ruby -v ruby 1.8.7 (2012-02-08 patchlevel 358) [universal-darwin12.0]
Gitインストール
都度githubからcloneする局面が出て来ますので、導入して無ければ入れておきましょう。
$ git version git version 1.7.11.3
rbenvインストール
複数バージョンのRubyの導入・管理が行える『rbenv』をインストールします。
$ cd~ $ git clone git://github.com/sstephenson/rbenv.git .rbenv Cloning into '.rbenv'... remote: Counting objects: 1743, done. remote: Compressing objects: 100% (749/749), done. remote: Total 1743 (delta 1131), reused 1517 (delta 962) Receiving objects: 100% (1743/1743), 254.66 KiB | 89 KiB/s, done. Resolving deltas: 100% (1131/1131), done.
rbenv実行の為のパスを通します。rbenv配下のものはbin/とshims/の計2つ。
$ echo 'export PATH="$HOME/.rbenv/bin:$HOME/.rbenv/shims:$PATH"' >> ~/.bash_profile $ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile $ source ~/.bash_profile
rbenvで現在導入されているRubyの内容を確認。現在入っているのは冒頭確かめたもののみ。
$ rbenv versions * system (set by /Users/shinyaa31/.rbenv/version)
ruby-buildインストール
rbenvのプラグインで、Unixライクなシステムで異なるバージョンのRubyをコンパイルし、インストール出来るものになります。rbenv installが柄逢えるようになります。インストール手順は上記エントリ内容そのままです。
$ mkdir -p ~/.rbenv/plugins $ cd ~/.rbenv/plugins $ git clone git://github.com/sstephenson/ruby-build.git Cloning into 'ruby-build'... remote: Counting objects: 2526, done. remote: Compressing objects: 100% (1440/1440), done. remote: Total 2526 (delta 1161), reused 2227 (delta 884) Receiving objects: 100% (2526/2526), 352.27 KiB | 165 KiB/s, done. Resolving deltas: 100% (1161/1161), done.
Rubyインストール by rbenv
上記で導入したrbenvでRubyをインストールします。まずは導入可能なバージョンの確認。ここでは2.x系の新しめな2.0.0-p247をチョイス。
$ rbenv install -l Available versions: 1.8.6-p383 1.8.6-p420 1.8.7-p249 : 1.9.3-p429 1.9.3-p448 1.9.3-preview1 1.9.3-rc1 2.0.0-dev 2.0.0-p0 2.0.0-p195 2.0.0-p247 2.0.0-preview1 2.0.0-preview2 2.0.0-rc1 2.0.0-rc2 2.1.0-dev 2.1.0-preview1 : ree-1.8.7-2012.01 ree-1.8.7-2012.02 topaz-dev
インストール開始。しかしコケました。opensslが原因のようです。
$ rbenv install 2.0.0-p247 Downloading openssl-1.0.1e.tar.gz... -> http://dqw8nmjcqpjn7.cloudfront.net/66bf6f10f060d561929de96f9dfe5b8c Installing openssl-1.0.1e... BUILD FAILED
brewでopensslインストール。
$ brew --version 0.9.4 $ brew install openssl
そして再度rbenv install実行。...するもまたもやエラー。今度はgcc等が原因となっているようです。
BUILD FAILED Inspect or clean up the working tree at /var/folders/p5/p0yjc08x2rv3qnwc6js8nbj80000gn/T/ruby-build.20131113181200.81292 Results logged to /var/folders/p5/p0yjc08x2rv3qnwc6js8nbj80000gn/T/ruby-build.20131113181200.81292.log Last 10 log lines: checking for gcc-4.2... no checking for clang... no checking for gcc... no checking for cc... no checking for gcc... no checking for cc... no checking for cl.exe... no
XCodeを導入、そこから[Preferences]→[Downloads]→[Components]でCommand Line Toolsをインストール。
再度インストール挑戦。XCode CLIの導入で諸々必要なライブラリは入ったようです。
$ rbenv install 2.0.0-p247 Downloading ruby-2.0.0-p247.tar.gz... -> http://dqw8nmjcqpjn7.cloudfront.net/c351450a0bed670e0f5ca07da3458a5b Installing ruby-2.0.0-p247... Installed ruby-2.0.0-p247 to /Users/shinyaa31/.rbenv/versions/2.0.0-p247 $
状況確認及びバージョン切替。新しいバージョンのRuby導入と、利用バージョンの切替が完了しました。今後の作業はこのRuby2.0.0-p247で行います。
rbenv versions * system (set by /Users/shinyaa31/.rbenv/version) 2.0.0-p247 $ rbenv global 2.0.0-p247 $ rbenv versions system * 2.0.0-p247 (set by /Users/shinyaa31/.rbenv/version) $
knife-soloインストール by gem
当エントリのゴールとなる環境のメインとなるもの。このknife-soloインストールでChef自体も入ります。
あれ?そう言えばRubyGemsのインストールはどこかでしてたっけ?下記エントリでは1.9系の場合はRuby導入時にRubyGemsも入る、とあるけど...2.0系導入した事によって自然と入ったのかな?まぁひとまず良しとしよう(笑)この時点で導入されていなければ導入しておき、gemにてknife-soloをインストールしてください。
$ sudo gem install knife-solo Password: Fetching: mixlib-config-2.0.0.gem (100%) Successfully installed mixlib-config-2.0.0 : Fetching: pry-0.9.12.3.gem (100%) Successfully installed pry-0.9.12.3 Fetching: chef-11.8.0.gem (100%) Successfully installed chef-11.8.0 Fetching: knife-solo-0.4.0.gem (100%) Thanks for installing knife-solo! If you run into any issues please let us know at: https://github.com/matschaffer/knife-solo/issues If you are upgrading knife-solo please uninstall any old versions by running `gem clean knife-solo` to avoid any errors. See http://bit.ly/CHEF-3255 for more information on the knife bug that causes this. Successfully installed knife-solo-0.4.0 Parsing documentation for mixlib-config-2.0.0 Installing ri documentation for mixlib-config-2.0.0 : Installing ri documentation for pry-0.9.12.3 Parsing documentation for chef-11.8.0 Installing ri documentation for chef-11.8.0 Parsing documentation for knife-solo-0.4.0 Installing ri documentation for knife-solo-0.4.0 28 gems installed $ :
rbenv rehashで上記インストール内容を反映。これで、knife soloコマンドが使えるようになります。
$ rbenv rehash
まず最初にknife設定コマンドを実行。基本そのままEnter押下で進めました。
$ knife configure WARNING: No knife configuration file found Where should I put the config file? [/Users/shinyaa31/.chef/knife.rb] Please enter the chef server URL: [https://xxxxxxxxxxxxx-MacBook-Air.local:443] Please enter an existing username or clientname for the API: [shinyaa31] Please enter the validation clientname: [chef-validator] Please enter the location of the validation key: [/etc/chef-server/chef-validator.pem] Please enter the path to a chef repository (or leave blank): ***** You must place your client key in: /Users/shinyaa31/.chef/shinyaa31.pem Before running commands with Knife! ***** You must place your validation key in: /etc/chef-server/chef-validator.pem Before generating instance data with Knife! ***** Configuration file written to /Users/shinyaa31/.chef/knife.rb $
knife solo initコマンドでknifeコマンド実行のためのディレクトリ(プロジェクト?)を作成します。編集する内容はこのフォルダ配下、またknife soloコマンドの実行は主にこのフォルダ直下にて行う事になります。
$ knife solo init chef-labo Creating kitchen... Creating knife.rb in kitchen... Creating cupboards... $ $ ls -la ./chef-labo/ total 8 drwxr-xr-x 10 shinyaa31 staff 340 11 13 19:32 . drwxr-xr-x+ 91 shinyaa31 staff 3094 11 13 19:32 .. drwxr-xr-x 3 shinyaa31 staff 102 11 13 19:32 .chef -rw-r--r-- 1 shinyaa31 staff 12 11 13 19:32 .gitignore drwxr-xr-x 3 shinyaa31 staff 102 11 13 19:32 cookbooks drwxr-xr-x 3 shinyaa31 staff 102 11 13 19:32 data_bags drwxr-xr-x 3 shinyaa31 staff 102 11 13 19:32 environments drwxr-xr-x 3 shinyaa31 staff 102 11 13 19:32 nodes drwxr-xr-x 3 shinyaa31 staff 102 11 13 19:32 roles drwxr-xr-x 3 shinyaa31 staff 102 11 13 19:32 site-cookbooks $
berkshelfのインストール by gem
- Berkshelf
- nanapi勉強会でVagrant + Berkshelfについて発表しました | Engine Yard Blog JP
- BerkshelfでCookbookを管理する #opschef_ja « CREATIONLINE, INC.
Cookbookとその依存関係の管理を行うツール、berkshelfもこのタイミングでインストールします。knife-solo同様gemにて実行。
$ sudo gem install berkshelf Password: Fetching: i18n-0.6.5.gem (100%) Successfully installed i18n-0.6.5 : Parsing documentation for rbzip2-0.2.0 Installing ri documentation for rbzip2-0.2.0 Parsing documentation for berkshelf-2.0.10 Installing ri documentation for berkshelf-2.0.10 42 gems installed $
rbenv rehash後、試しに設定ファイル(Berksfile)を作成し、ダウンロードを実行してみます。(※ちなみにオプション --path 以下を省略すると ~/.berkshelf/cookbooks に導入される模様。それは避けたいので、作成プロジェクト配下のcookbooks/を指定しています)。
$ rbenv rehash $ cd chef-labo/ $ vi Berksfile -------------- site :opscode cookbook 'mysql' cookbook 'nginx', '~> 0.101.5' -------------- $ $ berks install --path ./cookbooks/ Installing mysql (4.0.4) from site: 'http://cookbooks.opscode.com/api/v1/cookbooks' Installing nginx (0.101.6) from site: 'http://cookbooks.opscode.com/api/v1/cookbooks' Installing openssl (1.1.0) from site: 'http://cookbooks.opscode.com/api/v1/cookbooks' Installing build-essential (1.4.2) from site: 'http://cookbooks.opscode.com/api/v1/cookbooks' Installing runit (1.4.0) from site: 'http://cookbooks.opscode.com/api/v1/cookbooks' Installing yum (2.4.2) from site: 'http://cookbooks.opscode.com/api/v1/cookbooks' Installing bluepill (2.3.0) from site: 'http://cookbooks.opscode.com/api/v1/cookbooks' Installing rsyslog (1.9.0) from site: 'http://cookbooks.opscode.com/api/v1/cookbooks' Installing ohai (1.0.2) from site: 'http://cookbooks.opscode.com/api/v1/cookbooks' $
cookbooks配下にそれぞれクックブックがダウンロードされました!
$ ls -lta ./cookbooks/ total 0 drwxr-xr-x 11 shinyaa31 staff 374 11 13 20:00 . drwxr-xr-x 12 shinyaa31 staff 408 11 13 20:00 .. drwxr-xr-x 11 shinyaa31 staff 374 11 13 20:00 bluepill drwxr-xr-x 8 shinyaa31 staff 272 11 13 20:00 build-essential drwxr-xr-x 10 shinyaa31 staff 340 11 13 20:00 mysql drwxr-xr-x 13 shinyaa31 staff 442 11 13 20:00 nginx drwxr-xr-x 8 shinyaa31 staff 272 11 13 20:00 ohai drwxr-xr-x 8 shinyaa31 staff 272 11 13 20:00 openssl drwxr-xr-x 9 shinyaa31 staff 306 11 13 20:00 rsyslog drwxr-xr-x 11 shinyaa31 staff 374 11 13 20:00 runit drwxr-xr-x 12 shinyaa31 staff 408 11 13 20:00 yum
knife-soloの実行
Chefのレシピ作成やその他環境整備についてはこのエントリでは割愛します。そしていよいよ実行へ。
事前準備としてknife solo prepare (ホスト名)が必要となり、VPC外部から直接アクセス可能な状態のEC2ならばホスト名にそのまま対象のIPなりドメイン名なりを指定すれば良い訳ですが、踏み台用EC2サーバを介してを用いて対象となるEC2サーバに対しknife-soloを実行する場合は一つ仕込みが必要です。以下都元さんのエントリ『踏み台(bastion)サーバを構築する』の手順を行う事で多段アクセスを経ての対象サーバでの操作が可能となります。
$ vi /Users/(ユーザー名)/.ssh/config Host bastion Hostname 54.222.xxx.xxx User ec2-user IdentityFile /Path/to/pemfile/xxxxxxx.pem Host web-server Hostname 10.0.0.123 User ec2-user IdentityFile /Path/to/pemfile/xxxxxxx.pem ProxyCommand ssh bastion -W %h:%p $ ssh web-server (踏み台サーバを介したWebサーバへのアクセスが一発で可能に)
これで、晴れてknife-solo実行が所定のEC2サーバに対して行えるようになりました!
$ knife-solo prepare web-server $ knife-solo cook web-server
まとめ
という訳で一連の流れを追って整理してみました。実行までに漕ぎ着けられれば何だ簡単じゃん、という気もしますが、こうして見てみると割と色々なテクニックやプロダクトを組み合わせて成立しているのだなというのが分かります。一言で言えば『◯◯して△△したあと、□□□□をやれば行けますよ』という場合でも、割と前提を知ってないとちんぷんかんぷん状態になりがちです。学んだ・聞いた・教わった内容をこうしてまとめておくだけでも、十分勉強になりますね。備忘録の域を出ない内容ではありますが、このエントリがどなたかのChef(Knife-solo)での環境構築の一助になれば幸いです。